#ifndef MAT_H
#define MAT_H

#include "ens.h"
/** \file mat.h
 * \brief Definition et manipulation de matrice

 * Le fichier mat contient la definition de la structure d'une matrice,
 * ainsi que les definitions des fonctions de creation et de
 * manipulation de ces matrices.
 */

/**
 * Une matrice est composée d'un tableau de tableau de booléen et de deux
 * entiers, hauteur et largeur
 * \author Maxime Cogney
 */
typedef struct{bool **v;unsigned int h; unsigned int l;} Mat;

/**
 * Allocation d'une matrice
 * \return pointeur vers une matrice
 * \param [in] hauteur entier
 * \param [in] largeur entier
 */
Mat* MatAlloc(int h, int l);

/**
 * Libère une matrice
 * \return -
 * \param [in] pointeur vers une matrice
 */
void MatFree(Mat* m);

/**
 * renvoie la valeur booléenne matrice[x,y]
 * \return un booléen
 * \param [in] entier x
 * \param [in] entier y
 * \param [in] pointeur sur une matrice
 */
bool MatVal(int x, int y, Mat* m);

/**
 * stocke une valeur boléenne dans une matrice[x,y]
 * \return -
 * \param [in] entier x
 * \param [in] entier y
 * \param [in] booléen v
 * \param [in] pointeur vers une matrice
 */
void MatSet(int x, int y, bool v, Mat* m);

/**
 * enregistre une matrice dans un fichier
 * \return -
 * \param [in] tableau de caractères
 * \param [in] pointeur vers une matrice
 */
void MatSauve(char *fichier, Mat* m);

/**
 * lit une matrice depuis un fichier
 * \return pointeur vers une matrice
 * \param [in] tableau de caractères
 */
Mat* MatLit(char *nomfichier);

/**
 * initialise une matrice de valeur null en dehors des bordures
 * \return -
 * \param [in] pointeur vers une matrice
 */
void MatCadre(Mat* m);

#endif
